home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / Main.bin / StringTreeModel.java < prev    next >
Text File  |  1998-09-27  |  3KB  |  132 lines

  1. package com.symantec.itools.swing.models;
  2.  
  3. import com.sun.java.swing.tree.*;
  4. import com.sun.java.swing.tree.DefaultMutableTreeNode;
  5. import java.util.Vector;
  6. import java.util.Enumeration;
  7. import java.util.Stack;
  8.  
  9. public class StringTreeModel
  10.     extends com.sun.java.swing.tree.DefaultTreeModel
  11. {
  12.     public StringTreeModel()
  13.     {
  14.         super(new DefaultMutableTreeNode("root"));
  15.     }
  16.  
  17.     //
  18.     // Properties
  19.     //
  20.  
  21.     public void setItems(String[] items)
  22.     {
  23.         ((DefaultMutableTreeNode)getRoot()).removeAllChildren();
  24.  
  25.         int indent = 0;
  26.         int lastIndent = 0;
  27.         Vector parents = new Vector();
  28.         parents.addElement(getRoot());
  29.         DefaultMutableTreeNode newNode = null;
  30.  
  31.         for (int i = 0; i < items.length ;i++)
  32.         {
  33.             String newItem = items[i];
  34.             indent = 0;
  35.             while(Character.isWhitespace(newItem.charAt(indent)))
  36.                 indent++;
  37.  
  38.             if (indent - lastIndent < 2)
  39.             {
  40.                 newNode = new DefaultMutableTreeNode(newItem.trim());
  41.                 ((DefaultMutableTreeNode)parents.elementAt(indent)).add(newNode);
  42.                 if (parents.size() < indent +2)
  43.                     parents.setSize(parents.size()+1);
  44.                 parents.setElementAt(newNode,indent+1);
  45.                 lastIndent = indent;
  46.             }
  47.             else
  48.             {
  49.                 System.err.println("illegal tree node: "+newItem+"  - check indentation");
  50.                 nodeStructureChanged((TreeNode)getRoot());
  51.                 break;
  52.             }
  53.         }
  54.  
  55.         nodeStructureChanged((TreeNode)getRoot());
  56.     }
  57.  
  58.     public String[] getItems()
  59.     {
  60.         Vector itemsVector = new Vector();
  61.  
  62.         PreorderEnumeration enum = new PreorderEnumeration((TreeNode)getRoot());
  63.         enum.nextElement(); // skip root
  64.         while(enum.hasMoreElements())
  65.         {
  66.             DefaultMutableTreeNode nextNode = (DefaultMutableTreeNode)enum.nextElement();
  67.             StringBuffer nextString = new StringBuffer(nextNode.toString());
  68.             for(int i = 1; i < nextNode.getLevel(); i++)
  69.                 nextString.insert(0," ");
  70.             itemsVector.addElement(nextString.toString());
  71.         }
  72.  
  73.         String items[] = new String[itemsVector.size()];
  74.         itemsVector.copyInto(items);
  75.         return items;
  76.     }
  77.  
  78.     public void setRootName(String rootName)
  79.     {
  80.         ((DefaultMutableTreeNode)getRoot()).setUserObject(rootName);
  81.         reload();
  82.     }
  83.  
  84.     public String getRootName()
  85.     {
  86.         String rootName = (String)(((DefaultMutableTreeNode)getRoot()).getUserObject());
  87.         if (rootName != null)
  88.             return rootName;
  89.         else
  90.             return "root";
  91.     }
  92.  
  93.     //
  94.     // Implementation
  95.     //
  96.  
  97.     // from DefaultMutableTreeNode...
  98.     final class PreorderEnumeration
  99.         implements Enumeration
  100.     {
  101.         protected Stack stack;
  102.  
  103.         public PreorderEnumeration(TreeNode rootNode)
  104.         {
  105.             super();
  106.             Vector v = new Vector(1);
  107.             v.addElement(rootNode);    // PENDING: don't really need a vector
  108.             stack = new Stack();
  109.             stack.push(v.elements());
  110.         }
  111.  
  112.         public boolean hasMoreElements()
  113.         {
  114.             return (!stack.empty() && ((Enumeration)stack.peek()).hasMoreElements());
  115.         }
  116.  
  117.         public Object nextElement()
  118.         {
  119.             Enumeration    enumer = (Enumeration)stack.peek();
  120.             TreeNode    node = (TreeNode)enumer.nextElement();
  121.             Enumeration    children = node.children();
  122.  
  123.             if (!enumer.hasMoreElements())
  124.                 stack.pop();
  125.             if (children.hasMoreElements())
  126.                 stack.push(children);
  127.             return node;
  128.         }
  129.     }
  130. }
  131.  
  132.